Introduction

This report explores the dataframes from April 2016 (sense_my_feup.Rmd). The data is soon filtered to consider only points in the Porto square. Finally, it concludes the main edges for better evaluation in the next chapters.

Index:

  • Data setup
  • Intersession time
  • Mapping
  • Sessions
  • Speed
  • Time series (first attempt)

SenseMyFEUP data

Data loading

Data used is previously filtered by travelmode (car and bus) and date (April 2016).
We filter our data to consider only points in a square of the Porto Metropolitan area.

Intersession times

This section explores the time between different sessions in the same edge.

Intersession times and number of sessions.

All intersession time Porto April16. This figure shows that most of the edges have an intersession time greater than 1 hour.

Intersession time along the week. Here we can see that weekends have an intersession time way bigger than weekdays, this could be caused by users going out of Porto on the weekends, reaching out our frontier.

We recommend that you use the dev version of ggplot2 with `ggplotly()`
Install it with: `devtools::install_github('hadley/ggplot2')`

Number of sessions per edge. We can see the limitations in our data when most of the edges have less than 5 sessions in the whole month, mostly even having just 1. In next chapters we will study more the edges with more than 50 sessions.

Analizing edges >50 sessions.

  • hotedges -> more 50 sessions. 3537 sessions in total.
  • superhot_edges -> more 170 sessions. 1369 sessions in total.
Points (probably to delete)

This section is needed to then map. Maps the amount of points. It is better to map with number of sessions.

ECDF

Only 25% is under 1h intersession time.

As expected, there is higher intersession time at night.

ECDF by #sessions

Edges with >50 sessions.

We recommend that you use the dev version of ggplot2 with `ggplotly()`
Install it with: `devtools::install_github('hadley/ggplot2')`
We recommend that you use the dev version of ggplot2 with `ggplotly()`
Install it with: `devtools::install_github('hadley/ggplot2')`
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Removed 248 rows containing non-finite values (stat_bin).

Showing maps

Traffic Map April Porto 2016 all

Traffic Map April 2016 all >50

Top edges

Number of sessions analysis.

Day of the week

Scale for 'x' is already present. Adding another scale for 'x', which will replace the existing scale.

By day

Scale for 'x' is already present. Adding another scale for 'x', which will replace the existing scale.

By hour

Speeds >50

Speed by week

Speed by day

Speed by hour

Number of session per hour

Edges per half hour

prueba <- table(cut(filter(df_hotedges_april16pt, day(time) < 7)$time, breaks = "30 mins"))
plot(prueba, xlab = "date", ylab = "frequency") 
LS0tCnRpdGxlOiAnU2Vuc2UgTXkgRkVVUCAtIEFwcmlsIDIwMTYgRGF0YScKYXV0aG9yOiAiRGFuaWVsYSBTLiBHaWwiCmRhdGU6IDI1LTA4LTIwMTcKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBJbnRyb2R1Y3Rpb24gCgpUaGlzIHJlcG9ydCBleHBsb3JlcyB0aGUgZGF0YWZyYW1lcyBmcm9tIEFwcmlsIDIwMTYgKHNlbnNlX215X2ZldXAuUm1kKS4KVGhlIGRhdGEgaXMgc29vbiBmaWx0ZXJlZCB0byBjb25zaWRlciBvbmx5IHBvaW50cyBpbiB0aGUgUG9ydG8gc3F1YXJlLiAKRmluYWxseSwgaXQgY29uY2x1ZGVzIHRoZSBtYWluIGVkZ2VzIGZvciBiZXR0ZXIgZXZhbHVhdGlvbiBpbiB0aGUgbmV4dCBjaGFwdGVycy4gCgojIyMjIEluZGV4OiAKCiAgKiBEYXRhIHNldHVwIAogICogSW50ZXJzZXNzaW9uIHRpbWUKICAqIE1hcHBpbmcgCiAgKiBTZXNzaW9ucyAKICAqIFNwZWVkCiAgKiBUaW1lIHNlcmllcyAoZmlyc3QgYXR0ZW1wdCkKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7ciBlY2hvID0gRkFMU0UsIGV2YWw9RkFMU0V9CnNhdmUuaW1hZ2UoIlNlbnNlbXlXb3JrU3BhY2UuUkRhdGEiKQojbG9hZCgiZGZfZmlyc3Rfc2Vzc2lvbl9jYXJzX2FwcmlsMTYuUmRhIikKbG9hZCgiU2Vuc2VteVdvcmtTcGFjZS5SRGF0YSIpCnNvdXJjZSgiLi4vZnVuY3Rpb25zL2NvbXBhcmluZ19lZGdlc19sZXZlbC5SIikKYGBgCgoKIyBTZW5zZU15RkVVUCBkYXRhCgojIyBEYXRhIGxvYWRpbmcKIERhdGEgdXNlZCBpcyBwcmV2aW91c2x5IGZpbHRlcmVkIGJ5IHRyYXZlbG1vZGUgKGNhciBhbmQgYnVzKSBhbmQgZGF0ZSAoQXByaWwgMjAxNikuICAgICAgCiBXZSBmaWx0ZXIgb3VyIGRhdGEgdG8gY29uc2lkZXIgb25seSBwb2ludHMgaW4gYSBzcXVhcmUgb2YgdGhlIFBvcnRvIE1ldHJvcG9saXRhbiBhcmVhLiAKIApgYGB7ciBlY2hvPUZBTFNFLCBldmFsPUZBTFNFfQojRmlsdGVyaW5nIGJ5IHJlY3RhbmdsZSBpbiBQb3J0byAKCmRmX2VkZ2VzX2FwcmlsMTYgPC0gZGZfc3BlZWQKCmRmX2VkZ2VzX2FwcmlsMTZwdCA8LSBkZl9zcGVlZCAlPiUgCiAgZmlsdGVyKGxhdCA8IDQxLjE4NTkzNTI4MDgxNTUsIGxhdCA+IDQxLjEzNjQ3MjY1NDYsIGxvbiA+IC04LjY5MTI5NDA2ODE0MDUsIGxvbiA8IC04LjU1Mzk2OTM0MjI4KQpgYGAKCiMjIEludGVyc2Vzc2lvbiB0aW1lcwogIFRoaXMgc2VjdGlvbiBleHBsb3JlcyB0aGUgdGltZSBiZXR3ZWVuIGRpZmZlcmVudCBzZXNzaW9ucyBpbiB0aGUgCnNhbWUgZWRnZS4gIAogCiMjIyBJbnRlcnNlc3Npb24gdGltZXMgYW5kIG51bWJlciBvZiBzZXNzaW9ucy4KYGBge3IgZWNobz1GQUxTRSwgZXZhbD1GQUxTRX0KCiMgVHJhbnNmb3JtaW5nIHNlY29uZHMgdG8gdGltZXN0YW1wIAoKZGZfZWRnZXNfYXByaWwxNnB0JHRpbWUgPC0gYXMuUE9TSVhjdChkZl9lZGdlc19hcHJpbDE2cHQkc2Vjb25kcywgb3JpZ2luPSIxOTcwLTAxLTAxIikKZGZfc3BlZWRfdG9wJHRpbWUgPC0gYXMuUE9TSVhjdChkZl9zcGVlZF90b3Akc2Vjb25kcywgb3JpZ2luPSIxOTcwLTAxLTAxIikKZGZfc3BlZWQkdGltZSA8LSBhcy5QT1NJWGN0KGRmX3NwZWVkJHNlY29uZHMsIG9yaWdpbj0iMTk3MC0wMS0wMSIpCgojIEdldHRpbmcgZGF0YSBmcm9tIGRmX3NwZWVkCgpkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0IDwtIGRmX2VkZ2VzX2FwcmlsMTZwdCAlPiUgCiAgZ3JvdXBfYnkod2F5X2lkLCBzZXNzaW9uX2lkKSAlPiUgCiAgc3VtbWFyaXNlKHNlY29uZHMgPSBtaW4oc2Vjb25kcykpCgojIENhbGN1bGF0aW5nIGludGVyc2Vzc2lvbiB0aW1lLgoKZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCA8LSBkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0ICAlPiUKICBhcnJhbmdlKGRlc2Mod2F5X2lkKSwgdGltZSkgJT4lIAogIG11dGF0ZShpbnRlcnNlc3Npb25fdGltZSA9IGMoMCxhcy5udW1lcmljKGRpZmYodGltZSksIHVuaXRzPSJtaW5zIikpKQoKZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCR0aW1lIDwtIGFzLlBPU0lYY3QoZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCRzZWNvbmRzLCBvcmlnaW49IjE5NzAtMDEtMDEiKQoKYGBgCgpBbGwgaW50ZXJzZXNzaW9uIHRpbWUgUG9ydG8gQXByaWwxNi4gClRoaXMgZmlndXJlIHNob3dzIHRoYXQgbW9zdCBvZiB0aGUgZWRnZXMgaGF2ZSBhbiBpbnRlcnNlc3Npb24gdGltZSBncmVhdGVyIHRoYW4gMSBob3VyLgpgYGB7ciBlY2hvPUZBTFNFfQpwbG90X2x5KHkgPSBkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0JGludGVyc2Vzc2lvbl90aW1lLCB0eXBlID0gImJveCIsIG5hbWUgPSAiQWxsIHdheV9pZHMiKSAlPiUgCiAgYWRkX2JveHBsb3QoeT0gZmlsdGVyKGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQsIGludGVyc2Vzc2lvbl90aW1lICE9IDAgKSRpbnRlcnNlc3Npb25fdGltZSwgbmFtZSA9ICJBdCBsZWFzdCAyIHNlc3Npb25zIikgJT4lIAogIGxheW91dCh0aXRsZT0iSW50ZXJzZXNzaW9uIHRpbWUgKG1pbnMpIiwgeWF4aXMgPSBsaXN0KHJhbmdlID0gYygwLDUwMDApKSkKCmBgYAoKSW50ZXJzZXNzaW9uIHRpbWUgYWxvbmcgdGhlIHdlZWsuCkhlcmUgd2UgY2FuIHNlZSB0aGF0IHdlZWtlbmRzIGhhdmUgYW4gaW50ZXJzZXNzaW9uIHRpbWUgd2F5IGJpZ2dlciB0aGFuIHdlZWtkYXlzLCB0aGlzIApjb3VsZCBiZSBjYXVzZWQgYnkgdXNlcnMgZ29pbmcgb3V0IG9mIFBvcnRvIG9uIHRoZSB3ZWVrZW5kcywgcmVhY2hpbmcgb3V0IG91ciBmcm9udGllci4gCmBgYHtyIGVjaG89RkFMU0V9CnAgPC0gZ2dwbG90KGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQsIGFlcyh4ID0gd2Vla2RheXModGltZSksIHkgPSBpbnRlcnNlc3Npb25fdGltZSwgZmlsbCA9IGludGVyYWN0aW9uKHdlZWtkYXlzKHRpbWUpKSApKSArIAogIGdlb21fYm94cGxvdCgpICsgCiAgeGxhYigiRGF5cyBvZiB0aGUgd2VlayIgKSArCiAgeWxhYigiSW50ZXJzZXNzaW9uIHRpbWUgKG1pbnMpIikgKwogIGdndGl0bGUoIkludGVyc2Vzc2lvbiB0aW1lKG1pbikgaW4gdGhlIHdlZWsgIikgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIkRvbWluZ28iLCAiU2VndW5kYSIsICJUZXLDp2EiLCAiUXVhcnRhIiwgIlF1aW50YSIsIAogICAgIlNleHRhIiwgIlPDoWJhZG8iKSkgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLDEwMDAwKSkKCgpwIDwtIHBsb3RseV9idWlsZChwKQpwCgpgYGAKCgpgYGB7ciBlY2hvPUZBTFNFLCBldmFsPSBGQUxTRX0KIyBIaXN0b2dyYW0gaW50ZXJzZXNzaW9uIHRpbWUuCmludDIgPC0gZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCAlPiUKICBmaWx0ZXIoIGludGVyc2Vzc2lvbl90aW1lICE9IDApICU+JSAKICBnZ3Bsb3QoYWVzKGludGVyc2Vzc2lvbl90aW1lLzYwKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDkpICsgCiAgZ2d0aXRsZSgiSW50ZXJzZXNzaW9uIHRpbWUgKGhvdXJzKSIpICsKICB4bGFiKCJIb3VycyIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeGxpbT1jKDAsMjAwKSkKZ2dwbG90bHkoaW50MikKCgpgYGAKCk51bWJlciBvZiBzZXNzaW9ucyBwZXIgZWRnZS4KV2UgY2FuIHNlZSB0aGUgbGltaXRhdGlvbnMgaW4gb3VyIGRhdGEgd2hlbiBtb3N0IG9mIHRoZSBlZGdlcyBoYXZlIGxlc3MgdGhhbiA1IHNlc3Npb25zCmluIHRoZSB3aG9sZSBtb250aCwgbW9zdGx5IGV2ZW4gaGF2aW5nIGp1c3QgMS4gCkluIG5leHQgY2hhcHRlcnMgd2Ugd2lsbCBzdHVkeSBtb3JlIHRoZSBlZGdlcyB3aXRoIG1vcmUgdGhhbiA1MCBzZXNzaW9ucy4gCgpgYGB7ciBlY2hvPUZBTFNFLCAgbWVzc2FnZT1GQUxTRX0KaW50MSA8LSBkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0ICU+JSAKICBncm91cF9ieSh3YXlfaWQpICU+JSAKICBzdW1tYXJpc2Uobl9zZXNzaW9ucyA9IG4oKSkgJT4lIAogIGdncGxvdChhZXMoeCA9bl9zZXNzaW9ucykpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEwKSArCiAgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKDAsMTUwKSkgKwogIGdndGl0bGUoIk51bWJlciBvZiBzZXNzaW9ucyBwZXIgd2F5X2lkIGluIFBvcnRvIikgKwogIHhsYWIoIk51bWJlciBvZiBzZXNzaW9ucyIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSA1MCwgc2l6ZSA9IDEsIGNvbG91ciA9ICIjRkYzNzIxIiwKICAgICAgICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIpCgpnZ3Bsb3RseShpbnQxKQpgYGAKCiMjIyBBbmFsaXppbmcgZWRnZXMgPjUwIHNlc3Npb25zLiAgCiogaG90ZWRnZXMgLT4gbW9yZSA1MCBzZXNzaW9ucy4gMzUzNyBzZXNzaW9ucyBpbiB0b3RhbC4KKiBzdXBlcmhvdF9lZGdlcyAtPiBtb3JlIDE3MCBzZXNzaW9ucy4gMTM2OSBzZXNzaW9ucyBpbiB0b3RhbC4gCgpgYGB7ciBlY2hvPUZBTFNFfQojQ3JlYXRlIGRmIHdpdGggd2F5X2lkcyB3aXRoID41MCBzZXNzaW9ucwoKZGZfaWRfaG90ZWRnZXNfYXByaWwxNnB0IDwtIGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQgJT4lIAogIGdyb3VwX2J5KHdheV9pZCkgJT4lIAogIHN1bW1hcmlzZShuX3Nlc3Npb25zID0gbigpKSAlPiUgIAogIGZpbHRlcihuX3Nlc3Npb25zID49IDUwKSAKCmRmX2hvdGVkZ2VzX2FwcmlsMTZwdCA8LSBkZl9pZF9ob3RlZGdlc19hcHJpbDE2cHQgJT4lIAogIG1lcmdlKHk9IGRmX2VkZ2VzX2FwcmlsMTZwdCwgYnk9IndheV9pZCIpCgojQ3JlYXRlIGRmIHdpdGggd2F5X2lkcyB3aXRoID4xNzAgc2Vzc2lvbnMgCiNUaGlzIGlzIE5PIExPTkdFUiB1c2VkLiAKI1VwZGF0ZWQgd2l0aCBkZl9zdXBlcmhvdGVkZ2VzX2FwcmlsMTZwdCBjcmVhdGVkIGluICBwcmVhbmFseXNpc19jb3Vyc2UuUm1kCmRmX2lkX3N1cGVyaG90ZWRnZXNfYXByaWwxNnB0IDwtIGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQgJT4lIAogIGdyb3VwX2J5KHdheV9pZCkgJT4lIAogIHN1bW1hcmlzZShuX3Nlc3Npb25zID0gbigpKSAlPiUgIAogIGZpbHRlcihuX3Nlc3Npb25zID49IDE3MCkgCgpkZl9zdXBlcmhvdGVkZ2VzX2FwcmlsMTZwdCA8LSBkZl9pZF9zdXBlcmhvdGVkZ2VzX2FwcmlsMTZwdCAlPiUgCiAgbWVyZ2UoeT0gZGZfZWRnZXNfYXByaWwxNnB0LCBieT0id2F5X2lkIikKCm5fZGlzdGluY3QoZGZfaG90ZWRnZXNfYXByaWwxNnB0JHNlc3Npb25faWQpCmBgYAoKIyMjIyMgUG9pbnRzIChwcm9iYWJseSB0byBkZWxldGUpIApUaGlzIHNlY3Rpb24gaXMgbmVlZGVkIHRvIHRoZW4gbWFwLiBNYXBzIHRoZSBhbW91bnQgb2YgcG9pbnRzLgpJdCBpcyBiZXR0ZXIgdG8gbWFwIHdpdGggbnVtYmVyIG9mIHNlc3Npb25zLiAKYGBge3IgZWNobz1GQUxTRSwgZXZhbD1GQUxTRX0gCiMgUE9JTlRTIGZvciBtYXBwaW5nCgojQWxsIHdpdGggc2Vzc2lvbnMgPiA1MApkZl9wb2ludHNfaG90ZWRnZXNfYXByaWwxNnB0IDwtIGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQgJT4lIAogIGdyb3VwX2J5KHdheV9pZCkgJT4lIAogIHN1bW1hcmlzZShuX3Nlc3Npb25zID0gbigpKSAlPiUgCiAgZmlsdGVyKG5fc2Vzc2lvbnMgPj0gNTApICU+JSAKICBtZXJnZSggeSA9IGRmX3BvaW50c19lZGdlX29zbV9hcHJpbDE2cHQsIGJ5ID0gIndheV9pZCIpIAoKZGZfcG9pbnRzX3N1cGVyaG90ZWRnZXNfYXByaWwxNnB0IDwtIGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQgJT4lIAogIGdyb3VwX2J5KHdheV9pZCkgJT4lIAogIHN1bW1hcmlzZShuX3Nlc3Npb25zID0gbigpKSAlPiUgCiAgZmlsdGVyKG5fc2Vzc2lvbnMgPj0gMTcwKSAlPiUgCiAgbWVyZ2UoIHkgPSBkZl9wb2ludHNfZWRnZV9vc21fYXByaWwxNnB0LCBieSA9ICJ3YXlfaWQiKSAKCgpkZl9zdXBlcmhvdGVkZ2VzX2FwcmlsMTZwdCA8LW11dGF0ZShkZl9zdXBlcmhvdGVkZ2VzX2FwcmlsMTZwdCwgY2xhc3MgPSBpZmVsc2UoaG91cih0aW1lKSA+PTcgJiBob3VyKHRpbWUpIDw9IDIwLCAKICAgICAgICAgICAgICAgICAgICAgICAgImRheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJuaWdodCIpKQooKQojRGF5CmRmX3BvaW50c19ob3RlZGdlc19hcHJpbDE2cHRfZCA8LSBkZl9ob3RlZGdlc19hcHJpbDE2cHQgJT4lIAogIGZpbHRlcihob3VyKHRpbWUpID49NywgaG91cih0aW1lKTw9IDIwLCBuX3Nlc3Npb25zID49IDUwKSAlPiUgCiAgbWVyZ2UoIHkgPSBkZl9wb2ludHNfZWRnZV9vc21fYXByaWwxNnB0LCBieSA9ICJ3YXlfaWQiKSAKCiMgTmlnaHQKZGZfcG9pbnRzX2FwcmlsMTZwdF9uaWdodF9uIDwtIGRmX2hvdGVkZ2VzX2FwcmlsMTZwdCAlPiUgCiAgZmlsdGVyKGhvdXIodGltZSkgPDcgfCBob3VyKHRpbWUpID4gMjAsIG5fc2Vzc2lvbnMgPj0gMjApICU+JSAKICBtZXJnZSggeSA9IGRmX3BvaW50c19lZGdlX29zbV9hcHJpbDE2cHQsIGJ5ID0gIndheV9pZCIpIAoKYGBgCgojIyMgRUNERiAKT25seSAyNSUgaXMgdW5kZXIgMWggaW50ZXJzZXNzaW9uIHRpbWUuIApgYGB7ciBlY2hvPUZBTFNFfQplMSA8LSBnZ3Bsb3Qoc3Vic2V0KGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQsIGludGVyc2Vzc2lvbl90aW1lID4gMCksIGFlcyhpbnRlcnNlc3Npb25fdGltZSkpICsgCiAgc3RhdF9lY2RmKGdlb20gPSAic3RlcCIpICsKICB4bGFiKCJJbnRlcnNlc3Npb24gdGltZShtaW5zKSIpCgplMiA8LSBnZ3Bsb3Qoc3Vic2V0KGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQsIGludGVyc2Vzc2lvbl90aW1lID4gMCksIGFlcyhpbnRlcnNlc3Npb25fdGltZSkpICsgCiAgc2NhbGVfeF9sb2cxMCgpICtzdGF0X2VjZGYoZ2VvbSA9ICJzdGVwIikgICsgeGxhYigiSW50ZXJzZXNzaW9uIHRpbWUgTG9nIikKCmdyaWQuYXJyYW5nZShlMSwgZTIsIG5jb2w9IDIsIHRvcCA9ICJJbnRlcnNlc3Npb24gdGltZSBhbGwgc2Vzc2lvbnMgUG9ydG8gKG1pbnMpIikKYGBgCiAKQXMgZXhwZWN0ZWQsIHRoZXJlIGlzIGhpZ2hlciBpbnRlcnNlc3Npb24gdGltZSBhdCBuaWdodC4gCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9RkFMU0V9CiMgQ2xhc3NpZnlpbmcgcG9pbnRzIGJ5IGRheSBmb3IgRUNERiAKZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCA8LW11dGF0ZShkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0LCBjbGFzcyA9IGlmZWxzZShob3VyKHRpbWUpID49NyAmIGhvdXIodGltZSkgPD0gMjAsIAogICAgICAgICAgICAgICAgICAgICAgICAiZGF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIm5pZ2h0IikpCgpkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0ICU+JSAKICBmaWx0ZXIoaW50ZXJzZXNzaW9uX3RpbWUgPjApICU+JSAKICBzdWJzZXQod2F5X2lkICVpbiUgZGZfaG90ZWRnZXNfYXByaWwxNnB0JHdheV9pZCkgJT4lIAogIGdncGxvdCggYWVzKGludGVyc2Vzc2lvbl90aW1lLCBjb2xvcj0gY2xhc3MgKSkgKyAKICBzY2FsZV94X2xvZzEwKCkgKyAKICBzdGF0X2VjZGYoZ2VvbSA9ICJzdGVwIikgKyAKICBnZ3RpdGxlKCJJbnRlcnNlc3Npb24gdGltZSA+NTAgc2Vzc2lvbnMgUG9ydG8iKQpgYGAKCgpFQ0RGIGJ5ICNzZXNzaW9ucyAKCmBgYHtyIGVjaG89RkFMU0V9CmRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQgJT4lIAogIGdyb3VwX2J5KHdheV9pZCkgJT4lIAogIHN1bW1hcmlzZShzZXNzaW9ucyA9IG4oKSApICU+JSAKICBnZ3Bsb3QoYWVzKHNlc3Npb25zKSkgKyAKICBzY2FsZV94X2xvZzEwKCkgKyBzdGF0X2VjZGYoZ2VvbSA9ICJzdGVwIikgKwogIGdndGl0bGUoIkVDREYgbnVtYmVyIG9mIHNlc3Npb25zIGFsbCBQb3J0byIpCiAgCmBgYAoKIyMjICBFZGdlcyB3aXRoID41MCBzZXNzaW9ucy4gCgpgYGB7ciBlY2hvPUZBTFNFLCBldmFsPVRSVUV9CmxvdzEgPC0gZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCAlPiUgCiAgc3Vic2V0KHdheV9pZCAlaW4lIGRmX2hvdGVkZ2VzX2FwcmlsMTZwdCR3YXlfaWQpICU+JSAKICBzdWJzZXQoIGludGVyc2Vzc2lvbl90aW1lIDwgcXVhbnRpbGUoZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCRpbnRlcnNlc3Npb25fdGltZSwgMC4zNSkpICU+JSAKICBnZ3Bsb3QoYWVzKGludGVyc2Vzc2lvbl90aW1lKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAzMCkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsMjAwLDEwKSkrCiAgeGxhYigiSW50ZXJzZXNzaW9uIHRpbWUgKG1pbnMpIikgKyAKICBnZ3RpdGxlKCJMb3dlc3QgMzUlIGludGVyc2Vzc2lvbiB0aW1lID41MCIpCgpnZ3Bsb3RseShsb3cxKQpgYGAKCgpgYGB7ciBlY2hvPUZBTFNFLCBldmFsPVRSVUV9CmMxIDwtIGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQgJT4lIAogIHN1YnNldCh3YXlfaWQgJWluJSBkZl9ob3RlZGdlc19hcHJpbDE2cHQkd2F5X2lkKSAlPiUgCiAgZ2dwbG90KGFlcyhpbnRlcnNlc3Npb25fdGltZSwgZmlsbCA9IGNsYXNzKSkgKyAKICBnZW9tX2hpc3RvZ3JhbSgpICsgCiAgeGxhYigiSW50ZXJzZXNzaW9uIHRpbWUgKG1pbikiKSArCiAgeGxpbShjKDAsMzAwMCkpICsKICB5bGltKGMoMCw1MDAwKSkgKwogIGdndGl0bGUoIkludGVyc2Vzc2lvbiB0aW1lID41MCBkYXkvbmlnaHQiKQoKZ2dwbG90bHkoYzEpIApgYGAKCgoKIyMjIFNob3dpbmcgbWFwcyAKClRyYWZmaWMgIE1hcCBBcHJpbCBQb3J0byAyMDE2IGFsbApgYGB7ciBldmFsPSBUUlVFfQojIFNob3dpbmcgTWFwLgptMSA8LSBtCm0xCiNtYXBzaG90KG0sIHVybCA9IHBhc3RlMChnZXR3ZCgpLCAiL21hcC5odG1sIikpCmBgYAoKVHJhZmZpYyAgTWFwIEFwcmlsIDIwMTYgYWxsID41MApgYGB7ciBlY2hvPUZBTFNFfQptXzUwIDwtIG0KbV81MCAKYGBgCgoKVG9wIGVkZ2VzIAoKYGBge3IgZWNobz1GQUxTRX0KbV9ob3QgPC0gbQptX2hvdApgYGAKCmBgYHtyIGVjaG89RkFMU0V9Cm1fMTAwIDwtIG0KbV8xMDAKYGBgCgoKIyMjIE51bWJlciBvZiBzZXNzaW9ucyBhbmFseXNpcy4KIyMjIyBEYXkgb2YgdGhlIHdlZWsgCmBgYHtyIGVjaG89IEZBTFNFfSAKcGxvdC5uX3Nlc3Npb25zKGRmX3NwZWVkLGRmX2hvdGVkZ2VzX2FwcmlsMTZwdCwgZGZfc3BlZWRfdG9wLCB3ZGF5KSArIAogIHhsYWIoIkRheSBvZiB0aGUgd2VlayIpICArCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCJEb21pbmdvIiwgIlNlZ3VuZGEiLCAiVGVyw6dhIiwgIlF1YXJ0YSIsICJRdWludGEiLCAKICAgICJTZXh0YSIsICJTw6FiYWRvIikpIAoKYGBgCgojIyMjIEJ5IGRheSAKYGBge3IgZWNobz0gRkFMU0V9CnBsb3Qubl9zZXNzaW9ucyhkZl9zcGVlZCwgZGZfaG90ZWRnZXNfYXByaWwxNnB0LCBkZl9zcGVlZF90b3AsIGRheSkgKyAKICB4bGFiKCJEYXkiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxLDMwLDEpKSAKYGBgCgojIyMjIEJ5IGhvdXIgCmBgYHtyIGVjaG89IEZBTFNFfSAKcGxvdC5uX3Nlc3Npb25zKGRmX3NwZWVkLGRmX2hvdGVkZ2VzX2FwcmlsMTZwdCwgZGZfc3BlZWRfdG9wLCBob3VyKSArIAogIHhsYWIoIkhvdXIiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLDIzLDEpKSAKYGBgCgoKCgoKIyMgU3BlZWRzID41MAoKYGBge3J9CiMgU3BlZWQgYnkgd2F5X2lkIGFuZCBzZXNzaW9uLlwKZGZfc3BlZWQgJT4lIAogIHN1YnNldCh3YXlfaWQgJWluJSBkZl9ob3RlZGdlc19hcHJpbDE2cHQkd2F5X2lkKSAlPiUgCiAgZ3JvdXBfYnkod2F5X2lkKSAlPiUgCiAgc3VtbWFyaXNlKGF2Z19zcGVlZCA9IG1lYW4oKHNwZWVkKjE4KS81KSwgbiA9IG4oKSApICU+JSAKICBnZ3Bsb3QoIGFlcyhhdmdfc3BlZWQpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAzKSAKYGBgCgpTcGVlZCBieSB3ZWVrIApgYGB7ciBlY2hvPUZBTFNFfQpwbG90LnNwZWVkKGRmX3NwZWVkLGRmX2hvdGVkZ2VzX2FwcmlsMTZwdCwgZGZfc3BlZWRfdG9wLCB3ZGF5LCBtZWRpYW4pICsgCiAgeGxhYigiRGF5IG9mIHRoZSB3ZWVrIikgICsKICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIkRvbWluZ28iLCAiU2VndW5kYSIsICJUZXLDp2EiLCAiUXVhcnRhIiwgIlF1aW50YSIsIAogICAgIlNleHRhIiwgIlPDoWJhZG8iKSkgCmBgYAoKU3BlZWQgYnkgZGF5CgpgYGB7ciBlY2hvPUZBTFNFfQpwbG90LnNwZWVkKGRmX3NwZWVkLCBkZl9ob3RlZGdlc19hcHJpbDE2cHQsIGRmX3NwZWVkX3RvcCwgZGF5KSArIAogIHhsYWIoIkRheSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDEsMzAsMSkpIAoKYGBgCgpTcGVlZCBieSBob3VyCmBgYHtyIGVjaG89RkFMU0V9CnBsb3Quc3BlZWQoZGZfc3BlZWQsZGZfaG90ZWRnZXNfYXByaWwxNnB0LCBkZl9zcGVlZF90b3AsIGhvdXIpICsgCiAgeGxhYigiSG91ciIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsMjMsMSkpIApgYGAKCiMjCk51bWJlciBvZiBzZXNzaW9uIHBlciBob3VyCmBgYHtyIGVjaG89RkFMU0V9CmRmX2hvdGVkZ2VzX2FwcmlsMTZwdCAlPiUgCiAgICBmaWx0ZXIod2RheSh0aW1lKSAhPSAxICwgd2RheSh0aW1lKSAhPSA3ICkgJT4lIAogICAgZ3JvdXBfYnkoaG91ciA9aG91cih0aW1lKSkgJT4lIAogICAgc3VtbWFyaXNlKHNlc3Npb25zID0gbl9kaXN0aW5jdChzZXNzaW9uX2lkKSkgJT4lIAogIGdncGxvdChhZXMoaG91ciwgc2Vzc2lvbnMpKSArIAogIGdlb21fbGluZSgpKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwyMywxKSkKYGBgCgpFZGdlcyBwZXIgaGFsZiBob3VyCmBgYHtyfQpwcnVlYmEgPC0gdGFibGUoY3V0KGZpbHRlcihkZl9ob3RlZGdlc19hcHJpbDE2cHQsIGRheSh0aW1lKSA8IDcpJHRpbWUsIGJyZWFrcyA9ICIzMCBtaW5zIikpCnBsb3QocHJ1ZWJhLCB4bGFiID0gImRhdGUiLCB5bGFiID0gImZyZXF1ZW5jeSIpIApgYGAKCg==